﻿// ===============================================================================
//  Copyright © NewSQL.CN. All rights reserved .
//  技术论坛：http://newsql.cn/
//  个人博客：http://www.ymind.net/
//  版权所有：NewSQL中文社区 彦铭工作室
// ===============================================================================

using System;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

namespace Newsql.Data.MongoDB
{
	/// <summary>
	/// 为 MongoDB 实体对象提供基类。无法创建此类的实例。
	/// </summary>
	/// <typeparam name="T">实体对象的唯一标识符的类型。</typeparam>
	[Serializable]
	public abstract class MongoDBObject<T> : IDBObject<T> where T : BsonValue
	{
		/// <summary>
		/// 初始化 MongoDB 实体对象。
		/// </summary>
		protected MongoDBObject() : this(default(T)) { }

		/// <summary>
		/// 初始化 MongoDB 实体对象。
		/// </summary>
		/// <param name="id">实体对象的唯一标识符。</param>
		protected MongoDBObject(T id) { this.SetId(id); }

		#region IDBObject<T> Members

		/// <summary>
		/// 获取实体对象的唯一标识符。
		/// </summary>
		[BsonId]
		public T Id { get; private set; }

		/// <summary>
		/// 为实体对象设置新的唯一标识符。
		/// </summary>
		/// <param name="newId">新的唯一标识符。</param>
		public void SetId(T newId)
		{
			if (newId == null) throw new ArgumentNullException("newId");

			this.Id = newId;
		}

		#endregion
	}
}
